home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / EPASM13.ARJ / EPASM.DOC next >
Text File  |  1992-03-10  |  51KB  |  1,518 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.                                       E P A S M
  20.  
  21.                                Microprocessor assembler
  22.                                  for the Intel 8749H
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.                                     Joseph L. Hora
  52.                                    January 12, 1992
  53.                                      Version  1.3
  54.  
  55.  
  56.  
  57.  
  58.                       EPASM  Assembler     October 11, 1990
  59.  
  60.  
  61.  
  62.  
  63.                                   Table of Contents
  64.  
  65.           I.  Introduction  . . . . . . . . . . . . . . . . . . . . . .   2
  66.  
  67.           II.  Loading EPASM on your system . . . . . . . . . . . . . .   4
  68.  
  69.           III.  Creating an assembly language program . . . . . . . . .   6
  70.  
  71.           IV.  EPASM assembler directives . . . . . . . . . . . . . . .   8
  72.                Description of assembler directives  . . . . . . . . . .   8
  73.  
  74.           ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   8
  75.                     ORG . . . . . . . . . . . . . . . . . . . . . . . .   8
  76.                     "label"   . . . . . . . . . . . . . . . . . . . . .   8
  77.                     CONST   . . . . . . . . . . . . . . . . . . . . . .   9
  78.                     INCLUDE   . . . . . . . . . . . . . . . . . . . .    10
  79.  
  80.           V.  MCS-48 command notes  . . . . . . . . . . . . . . . . .    12
  81.  
  82.           VI. Assembling your program . . . . . . . . . . . . . . . .    15
  83.                command line options . . . . . . . . . . . . . . . . .    15
  84.                Running EPASM  . . . . . . . . . . . . . . . . . . . .    16
  85.  
  86.           VII.  Error messages  . . . . . . . . . . . . . . . . . . .    18
  87.                VII.1  Command, file, and DOS errors . . . . . . . . .    18
  88.                VII.2  EPASM assembly errors . . . . . . . . . . . . .    19
  89.  
  90.           VIII.  Using the EPROM programming device . . . . . . . . .    22
  91.  
  92.           INVOICE . . . . . . . . . . . . . . . . . . . . . . . . . .    24
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.                                           1
  115.  
  116.  
  117.  
  118.  
  119.                       EPASM  Assembler     October 11, 1990
  120.  
  121.  
  122.  
  123.  
  124.  
  125.           I.  Introduction
  126.  
  127.  
  128.           The EPASM program is a one-pass assembler that was written for
  129.           the Intel 8749H EPROM as described in the Intel Microcontroller
  130.           Handbook, using the MCS-48 instruction set.  This assembler can
  131.           also be used for other chips using this instruction set (8748H
  132.           EPROM, 8048AH/8049AH/8050AH ROM, and 8035AHL/8039AHL/8040AHL CPU)
  133.           as far as their memory structures are similar to the 8749H EPROM. 
  134.           This manual is not intended to be a reference for the MCS-48
  135.           instruction set or the above mentioned devices.  Please refer to
  136.           the Intel Microcontroller handbook for a complete description.
  137.  
  138.           The input to the EPASM program is a file containing "source code"
  139.           which is the EPROM program.  This contains the MCS-48 command
  140.           mnemonics, labels, assembler directives, and comments.  EPASM
  141.           converts it into the machine code of the processor, the actual
  142.           command numbers that will direct the processor to carry out the
  143.           steps the programmer has specified.  This machine code is saved
  144.           to a file which then must be transferred to the processor using a
  145.           EPROM "burner" or programming device.
  146.  
  147.           The output of EPASM is an object code module file.  In this file
  148.           are the encoded commands that were specified by the assembler
  149.           language program.   This program was written to construct an
  150.           ASCII file suitable for the PROMPRO 7 EPROM Programming Unit,
  151.           made by Logical Devices, Inc.   The files have also been used to
  152.           program EPROMs using the B&C Microsystems 1409 Universal (E)EPROM
  153.           programmer.  However, the file can also be passed to many other
  154.           EPROM programming devices that support the same format.  The file
  155.           could also be converted by a program of your own to the proper
  156.           format for your device.
  157.  
  158.           This program is distributed as shareware.  It may be freely
  159.           distributed to others, as long as it is in the form of the
  160.           archived .ZIP file which contains all the separate files
  161.           necessary for EPASM, and the files are not modified in any way. 
  162.           If you find this program useful, register your use of the program
  163.           by sending $15 to
  164.  
  165.  
  166.           Joseph Hora
  167.           46-1063 Emepela Way, Unit D
  168.           Kaneohe, HI  96744-3975
  169.  
  170.  
  171.           When registering, you will receive the latest version of EPASM
  172.           (without the annoying registration screen), a printed copy of the
  173.           manual, and the source code for EPASM (written in Turbo Pascal
  174.  
  175.                                           2
  176.  
  177.  
  178.  
  179.  
  180.                       EPASM  Assembler     October 11, 1990
  181.  
  182.           5.0).  You will also be notified when updates of the program
  183.           occur in the future.  Questions and technical support can be
  184.           obtained by mail at the above address, or by phone at (808) 956-
  185.           9848 weekdays 8am-5pm HST.
  186.  
  187.           Your registration entitles you to use this software on a single
  188.           computer and to make as many copies of this software as you wish
  189.           for backup purposes.
  190.  
  191.  
  192.           Note:  MCS-48 and the various chip names mentioned above and
  193.           throughout this manual are registered trademarks of the Intel
  194.           Corporation.  The EPASM program and associated files are
  195.           copyright 1990-92 by Joseph Hora.
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.                                           3
  237.  
  238.  
  239.  
  240.  
  241.                       EPASM  Assembler     October 11, 1990
  242.  
  243.  
  244.  
  245.  
  246.           II.  Loading EPASM on your system
  247.  
  248.  
  249.           Before doing anything else with your distribution disk, make a
  250.           backup copy first. 
  251.  
  252.           The approved EPASM release is archived using the PKZIP file
  253.           archiving utilities, and is named "EPASM.ZIP" .  This includes
  254.           the following files:
  255.  
  256.           EPASM.EXE  - the assembler program
  257.           EPASM.DOC  - this document
  258.           INSTR.SET  - the MCS-48 instruction set 
  259.           SAMPLE.ASM - a sample assembly language program
  260.           INVOICE.DOC - the registration form for EPASM
  261.  
  262.           To install the assembler, these files must be extracted and
  263.           placed in a directory of your choice.  The following are
  264.           instructions for various system options.
  265.  
  266.  
  267.           Single floppy drive systems:
  268.  
  269.           First, make a backup of the distribution disk.  Place the
  270.           original EPASM (source) disk in drive A: and type 
  271.  
  272.           diskcopy a: a:
  273.  
  274.           Wait until the computer is done reading the disk and asks you for
  275.           the target disk.  Remove the original disk and place a blank disk
  276.           in drive A:, then type <RETURN>.  
  277.  
  278.           If you have PKUNZIP and EPASM.ZIP on the same 360K or larger
  279.           floppy disk with nothing else, there will be enough room to store
  280.           all the original plus extracted files.  At the DOS prompt, type 
  281.  
  282.           pkunzip epasm
  283.  
  284.           and the files will be extracted to the default directory.
  285.  
  286.  
  287.  
  288.           Dual Floppy users:
  289.  
  290.           First, make a backup of the distribution disk.  Place the
  291.           original EPASM (source) disk in drive A: and a blank formatted
  292.           disk (target) in drive B: and type 
  293.  
  294.           diskcopy a: b:
  295.  
  296.  
  297.                                           4
  298.  
  299.  
  300.  
  301.  
  302.                       EPASM  Assembler     October 11, 1990
  303.  
  304.           Wait until the computer is done reading the disk and writing to
  305.           the target disk.   
  306.  
  307.           You can make an EPASM disk by doing the following:  First, make
  308.           sure you have PKUNZIP and EPASM on one disk, and place it in the
  309.           A: drive.  Place a blank formatted disk in the B: drive and type
  310.           "B:" to change default to that drive. Then type
  311.  
  312.           a:pkunzip a:epasm
  313.  
  314.           and the files will be extracted and written to the disk in the B:
  315.           drive.
  316.  
  317.  
  318.           Hard disk users:
  319.  
  320.           See the above instructions to backup your copy of EPASM before
  321.           you install the program on your hard drive.
  322.  
  323.           Place the disk with the files EPASM.ZIP and PKUNZIP in the A:
  324.           drive.  Make a subdirectory on your hard drive to place your
  325.           EPASM files into, for example, type
  326.  
  327.           C:\>mkdir epasm 
  328.  
  329.           (Type the commands above that are after the >).  Change directory
  330.           to that subdirectory
  331.  
  332.           C:\>cd epasm
  333.           C:\EPASM>
  334.  
  335.           Then type 
  336.  
  337.           C:\EPASM>a:pkunzip a:epasm
  338.  
  339.           and the files will be extracted and written to the directory you
  340.           are currently in on the hard drive.
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.  
  358.                                           5
  359.  
  360.  
  361.  
  362.  
  363.                       EPASM  Assembler     October 11, 1990
  364.  
  365.  
  366.  
  367.  
  368.           III.  Creating an assembly language program
  369.  
  370.  
  371.           You must create the source code for EPASM in a text editor
  372.           program.  This can be any program that allows you to save the
  373.           file in "ASCII" or "DOS" format.  This means just text, with no
  374.           page breaks, printer commands, formatting codes or commands
  375.           specific to the word processing program.  For example, in
  376.           WordPerfect, you can use the Ctrl-F5,1,1 command to save the
  377.           document as a DOS text file.  
  378.  
  379.           EPASM will create various output files, based on the text file
  380.           containing commands it is given and the command line options (see
  381.           Chapter VI.)  These output files can be viewed using the "TYPE"
  382.           command from the DOS command prompt.  The files can also be read
  383.           into the word processing program and viewed in the same way the
  384.           source code can.  This is most useful when the user is trying to
  385.           track down errors in the source code.
  386.  
  387.           There are two element types in the program, assembler directives
  388.           and MCS-48 commands.  Assembler directives are commands that are
  389.           processed during the assembly by the EPASM assembler.  The second
  390.           type are commands that are converted directly into machine code
  391.           for the EPROM processor.  These two types are discussed in the
  392.           following chapters.
  393.  
  394.           Below is a short excerpt from a sample program written for this
  395.           assembler:
  396.  
  397.  
  398.  
  399.           ; 
  400.           ; 
  401.           ;       IDLE routine:  remain here until interrupted 
  402.           ;
  403.           IDLE    mov       R3,#80        ;select expander 0, disable chop
  404.                   mov       a,#8F         ;address   "     " 
  405.                   outl      P2,a          ;   "      "     " 
  406.                   movd      P7,a          ;output slave idle state 
  407.                   call      riff          ;reset interrupt-in-progress
  408.                   jmp       IDLE          ;jump to IDLE 
  409.           ; 
  410.           ;   End of IDLE routine 
  411.           ; 
  412.  
  413.  
  414.           This short excerpt illustrates a number of characteristics of the
  415.           source code.  First, the simplest command is the semicolon
  416.           character ";", the comment command.  This simply instructs the
  417.           assembler to ignore all the characters following that one on the
  418.  
  419.                                           6
  420.  
  421.  
  422.  
  423.  
  424.                       EPASM  Assembler     October 11, 1990
  425.  
  426.           current line.  It can be used at the beginning of the line to
  427.           designate the entire line as a comment, or it can be at the end
  428.           of a valid command.  In the above example, it is used to space
  429.           out the routine with blank lines, hold the title of the routine,
  430.           and annotate each command line with a comment.  This is usually a
  431.           good practice, since even a small assembly language program is
  432.           difficult to follow without a few comments explaining the code,
  433.           even for the person who wrote the program!  
  434.  
  435.           Note that there is a mix of uppercase and lower case characters
  436.           in this example.  EPASM treats upper and lower case letters to be
  437.           equal.  Therefore, the commands "mov" and "MOV" are treated in
  438.           exactly the same way.
  439.  
  440.           The next assembler directive used is in the first non-comment
  441.           line, the text "IDLE".  This is being used as a "label", or a
  442.           marker designating that line or address in the program.  This
  443.           allows the programmer to reference commands in the program
  444.           without knowing the actual address of the command in the program
  445.           memory.  Notice at the end of the routine there is a "jmp IDLE"
  446.           command, which will cause the EPROM to loop back to the beginning
  447.           of the routine when it runs the program.  The EPASM program
  448.           determines the address of "IDLE" as it assembles the program.
  449.  
  450.           On the same line as the "IDLE" label is the MCS-48 command for
  451.           the processor.  Note that these words are all separated by a
  452.           number of spaces.  Any combinations of spaces and tabs may be
  453.           used to separate the words of each line.  The spacing can be
  454.           chosen arbitrarily to make the program easy to read.  In the
  455.           above example, the first column is reserved for labels.  This
  456.           makes the labels easy to see and therefore easier to follow the
  457.           flow of the program.  The next two columns hold the command
  458.           arguments, and the third column holds a comment for that line. 
  459.           This is a fairly standard format for assembly language programs. 
  460.           Another equally valid format would be to have the commands be in
  461.           one column, as in the following:
  462.  
  463.  
  464.           ; 
  465.           ; 
  466.           ;       IDLE routine:  remain here until interrupted 
  467.           ;
  468.           IDLE    mov R3,#80         ;select expander 0, disable chop
  469.                   mov a,#8F          ;address   "     " 
  470.                   outl P2,a          ;   "      "     " 
  471.                   movd P7,a          ;output slave idle state 
  472.                   call riff          ;reset interrupt-in-progress
  473.                   jmp IDLE           ;jump to IDLE 
  474.           ; 
  475.           ;   End of IDLE routine 
  476.           ; 
  477.  
  478.  
  479.  
  480.                                           7
  481.  
  482.  
  483.  
  484.  
  485.                       EPASM  Assembler     October 11, 1990
  486.  
  487.  
  488.  
  489.  
  490.           IV.  EPASM assembler directives
  491.  
  492.  
  493.           This chapter describes the valid assembler directives for the
  494.           EPASM program.  An assembler directive is a command that does not
  495.           directly generate machine code in the output file, but affects
  496.           the way EPASM compiles the program.   The following are the
  497.           recognized assembler directives, and a description of each:
  498.  
  499.           ;        ORG       "label"       CONST     INCLUDE
  500.  
  501.  
  502.  
  503.           Description of assembler directives:
  504.  
  505.  
  506.  
  507.           ; 
  508.                the comment character.  Directs EPASM to ignore all other   
  509.                characters following this one on the same line.
  510.            
  511.  
  512.           ORG  
  513.  
  514.                specifies the location  of the start of the program in the  
  515.                processor's program memory.  The default location if this   
  516.                directive is not used is zero.  The correct syntax is 
  517.  
  518.                 ORG addr
  519.  
  520.                where "addr" is the desired starting address, in
  521.                hexadecimal.
  522.  
  523.  
  524.           "label"  
  525.  
  526.                any word more that three characters long and less than nine
  527.                characters which is intended to mark a location in memory. 
  528.                I have enclosed the word "label" in quotes, since there is
  529.                no actual command that you invoke by typing "label", you
  530.                simply use a word that is not a command and the assembler
  531.                will interpret it as a label.  The label cannot be the same
  532.                as another of the assembler directives (such as ORG or
  533.                CONST), or be the same as one of the MCS-48 commands (such
  534.                as MOV or JMP).  Note that since no upper and lower case
  535.                distinctions are made, the label "IDLE" is treated the same
  536.                as the label "idle".  
  537.  
  538.                When the label appears as the first element of a line, that
  539.                equates the label with the memory position of that line. 
  540.  
  541.                                           8
  542.  
  543.  
  544.  
  545.  
  546.                       EPASM  Assembler     October 11, 1990
  547.  
  548.                When the label appears in any other line after a valid MCS-
  549.                48 command, that means that label is being referenced.  When
  550.                the EPROM program is assembled, the address corresponding to
  551.                the line where the label appears will be placed in that
  552.                command.  The label can be defined only once, but referenced
  553.                many times.  Below is a program excerpt where labels are
  554.                used.  The routine checks the test pins of the 8749H
  555.                processor and takes actions based on their state.  Notice
  556.                the use of labels: the first label is "Main" which is
  557.                referenced in a number of instructions.  Other labels allow
  558.                control of the program flow based on the conditions
  559.                encountered.
  560.  
  561.  
  562.           Example IV.1
  563.  
  564.           Main     JT0 Stat1           ;If T0 set, goto Stat1 
  565.                    JT1 Stat2           ;If not T0 and T1, go here  
  566.                    Mov R1,#20          ;Neither T0 or T1, BankA<<<<
  567.                    Jmp StatEnd         ;Exit Stat section 
  568.           Stat1    JNT1 Stat3          ; 
  569.                    Mov R1,#00          ;If T1 also set, then WAIT
  570.                    Jmp Main 
  571.           Stat3    Mov R1,#40          ;T0 and not T1, so Bank B<<<< 
  572.                    Jmp StatEnd         ; 
  573.           Stat2    Mov R1,#60          ;not T0 and T1, so Bank C<<<< 
  574.           StatEnd  Mov A,R1            ;Get current base address 
  575.                    XRL A,R2            ;Compare to last base address
  576.                    JZ  TakDat          ;If same, go inc. counters 
  577.                    MOV A,R1            ;Different bank this time
  578.                    MOV R2,A            ;set "old" base address here 
  579.                    IN  A,P1            ;set old port reading equal 
  580.                    MOV R3,A            ;     to current one 
  581.                    IN  A,P2            ;same for port 2 
  582.                    MOV R4,A 
  583.                    JMP Main            ;End of Main Program loop 
  584.  
  585.  
  586.                The processor running this program would repeat the loop, 
  587.                testing T1 and T2.  If the current base address as the last
  588.                time, the program jumps to the line designated by the
  589.                "StatEnd".
  590.  
  591.  
  592.  
  593.           CONST  
  594.  
  595.                This assembler directive is useful for equating hex
  596.                constants with words.  It is exactly like defining a label
  597.                that references a constant, not a memory location.  The
  598.                syntax of the directive is
  599.            
  600.                CONST  name   value
  601.  
  602.                                           9
  603.  
  604.  
  605.  
  606.  
  607.                       EPASM  Assembler     October 11, 1990
  608.  
  609.                For example, the program in example IV.1 above considers the
  610.                memory as being divided up into 3 "banks": A, B, and C, at
  611.                locations 20, 40, and 60 (hex).  Instead of the statements
  612.                above which explicitly specify these memory locations, one
  613.                could define constants to make this more readable.  If the
  614.                following lines are included in the program file:
  615.  
  616.                ;
  617.                ;        Constants     
  618.                CONST    BankA    20        ;Bank A: 32-63 decimal
  619.                CONST    BankB    40        ;Bank B: 64-95 decimal
  620.                CONST    BankC    60        ;Bank C: 96-127 decimal
  621.                ;        
  622.  
  623.                 Then example IV.1 could be written as follows:
  624.  
  625.  
  626.            Example IV.2
  627.  
  628.           Main     JT0 Stat1           ;If T0 set, goto Stat1 
  629.                    JT1 Stat2           ;If not T0 and T1, go here  
  630.                    Mov R1,#BankA       ;Neither T0 or T1, so Bank A<<<<
  631.                    Jmp StatEnd         ;Exit Stat section 
  632.           Stat1    JNT1 Stat3          ; 
  633.                    Mov R1,#00          ;If T1 also set, then WAIT
  634.                    Jmp Main 
  635.           Stat3    Mov R1,#BankB       ;T0 and not T1, so Bank B<<<< 
  636.                    Jmp StatEnd         ; 
  637.           Stat2    Mov R1,#BankC       ;not T0 and T1, so Bank C<<<< 
  638.           StatEnd  Mov A,R1            ;Get current base address 
  639.                    XRL A,R2            ;Compare to last base address
  640.                    JZ  TakDat          ;If same, go increment counters 
  641.                    MOV A,R1            ;Different bank this time, reset
  642.                    MOV R2,A            ;set "old" base address here 
  643.                    IN  A,P1            ;set old port reading equal 
  644.                    MOV R3,A            ;     to current one 
  645.                    IN  A,P2            ;same for port 2 
  646.                    MOV R4,A 
  647.                    JMP Main            ;End of Main Program loop 
  648.  
  649.  
  650.                The main reason for having the CONST directive is for
  651.                program clarity.  It is much easier to understand what you
  652.                are doing if you write data to "BankC" instead of "80".  
  653.  
  654.  
  655.  
  656.           INCLUDE  
  657.  
  658.                This directive causes EPASM to stop reading from the current
  659.                file being assembled, open the file specified and assemble
  660.                commands from that file into the program until the end of
  661.                that file is reached, then return to the original program
  662.  
  663.                                           10
  664.  
  665.  
  666.  
  667.  
  668.                       EPASM  Assembler     October 11, 1990
  669.  
  670.                and continue assembling.   It is effectively the same as
  671.                having those commands in the INCLUDE file in your program. 
  672.                The command syntax is
  673.  
  674.  
  675.                INCLUDE [path]filename
  676.  
  677.  
  678.                The file must be in the current directory, or the full path
  679.                specified, or else EPASM will not be able to find the file
  680.                and an error will be generated.  This command is useful if
  681.                you have a number of standard definitions or routines that
  682.                you use in many programs.  Then you can have a single file
  683.                containing them and all the other programs you write can
  684.                INCLUDE this file, so you don't have to have multiple copies
  685.                of the routines in every file.  Also, when editing the
  686.                standard routines, you can then recompile the routines and
  687.                the changes will be effective in all programs that use that
  688.                file.
  689.  
  690.                The only limitation on the include file is that you cannot
  691.                "nest" the include files.  That is, you cannot have an
  692.                "INCLUDE" file that has another "INCLUDE" command for yet
  693.                another file.
  694.  
  695.                Also, when there is an error in the program after the
  696.                include file, the line number reported will be the actual
  697.                line number of the program file plus the number of lines in
  698.                the include file.  If the error is in the include file
  699.                itself, the line number reported will be the line number of
  700.                the error in the include file plus the number of lines ahead
  701.                of it in the main program.  To be certain of the line
  702.                numbers, the best way is to look at the .WRK file created by
  703.                EPASM (see chapter VI).  This file will show all lines from
  704.                the main program and the include file together, in the order
  705.                assembled.
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.                                           11
  725.  
  726.  
  727.  
  728.  
  729.                       EPASM  Assembler     October 11, 1990
  730.  
  731.  
  732.  
  733.  
  734.           V.  MCS-48 command notes
  735.  
  736.  
  737.           The MCS-48 commands are stored in the file INSTR.SET.  This
  738.           should, for the purposes of EPASM, be the reference for the
  739.           correct syntax of the commands, since they will be expected to be
  740.           exactly as they are spelled in this file.  Note that all the
  741.           commands in the file INSTR.SET must be in upper case, since any
  742.           file assembled will be converted to upper case before being
  743.           compared to these commands.  The commands in the program to be
  744.           assembled can be in either upper or lower case, as discussed
  745.           above.
  746.  
  747.           The file INSTR.SET is an ASCII file, with each line being the
  748.           definition for one command.  Comments can also be included, if
  749.           they are preceded by a semicolon.  Below are a few sample lines.
  750.  
  751.           ;
  752.           ;
  753.           JF0  $    B6   2
  754.           JF1  $    76   2
  755.           JMP  !    04   2
  756.           MOV  A,#  23   2    ;this command moves in the immediate word
  757.           MOV  A,PSW C7  1
  758.           MOV  A,R0 F8   1
  759.           MOV  A,@R0 F0  1
  760.           MOV  A,@R1 F1  1
  761.           MOV  A,T  42   1
  762.  
  763.  
  764.           The format of the line is first the command word(s), then an
  765.           address or data indicator, if any, then the hex machine code for
  766.           the command, then the number of machine cycles for that command. 
  767.           The data or address indicators are the "#" and the "$"
  768.           characters, respectively, and they show that the command includes
  769.           a byte of data or an address.   For example, the command to move
  770.           immediate data to the accumulator is given by the line
  771.  
  772.           MOV A,#  23  2
  773.  
  774.           Since it contains the "#" character, it indicates that a second
  775.           byte is required; namely, the data to be moved into the
  776.           accumulator.  So the correct usage of this command would be
  777.  
  778.           MOV A,#1C        ;Move the value 28 (1C hexadecimal) to acc.
  779.  
  780.           Similarly, the "$" character indicates that an address is needed
  781.           in the command.  So in the command
  782.  
  783.           JF1  $    76   2
  784.  
  785.                                           12
  786.  
  787.  
  788.  
  789.  
  790.                       EPASM  Assembler     October 11, 1990
  791.  
  792.           the program will jump to the address given if flag 1 is set.  The
  793.           correct usage of this command is
  794.  
  795.           JF1  DONE          ;if flag set, jump to DONE
  796.  
  797.           where DONE is a label that is defined elsewhere in the program. 
  798.           Note that when the address is given by an eight-bit value, the
  799.           location of DONE must be on the same memory page as the JF1
  800.           command, or else the jump will not be performed properly.
  801.  
  802.           The "!" character is used for the JMP and the CALL commands,
  803.           which have a 11-bit address (in order to cover the entire 2K
  804.           address space).  The upper three bits of the address are encoded
  805.           into the first byte of the command.  This differs from the
  806.           address byte in commands using the "$" character, which is just
  807.           the second byte and therefore is limited to eight bits.  EPASM
  808.           treats these two commands specially and encodes the address
  809.           automatically.
  810.  
  811.           Other commands have no data or address information, and are
  812.           completely specified in the INSTR.SET file.  For example,
  813.  
  814.           MOV  A,@R1 F1  1
  815.  
  816.           specifies the command to move data memory contents into the
  817.           accumulator (register R1 has been previously loaded with the
  818.           desired address).  The correct usage of this command is
  819.  
  820.           MOV A,@R1           ;Move register-addressed data into acc.
  821.  
  822.           almost precisely as it appears in INSTR.SET.
  823.  
  824.           Because the INSTR.SET file is in ASCII format and read into the
  825.           EPASM program every time it is executed, the INSTR.SET file can
  826.           be edited to change the syntax of the commands, if desired.  This
  827.           is not usually recommended, since it is good to keep the command
  828.           names similar to the MCS-48 commands for clarity.  However, if
  829.           you wish to program for a different EPROM with a different
  830.           command set, one could simply change the file INSTR.SET to
  831.           contain the commands in the alternate instruction set.  The only
  832.           restriction is that the CALL and JMP commands cannot be changed,
  833.           since they are handled in a special way.  Also, new commands with
  834.           the "!" character cannot be added, since it requires changes in
  835.           the EPASM program.  Of course, if you have registered your copy
  836.           of EPASM and have the source code, you can alter the assembler
  837.           program for different devices.  
  838.  
  839.           Another feature of EPASM is the ability to do simple arithmetic
  840.           within the statement with hexadecimal numbers.  The allowed
  841.           operations are addition and subtraction.  For example, say that
  842.           you wanted to move the value 8C into the accumulator.  The
  843.           command would be
  844.  
  845.  
  846.                                           13
  847.  
  848.  
  849.  
  850.  
  851.                       EPASM  Assembler     October 11, 1990
  852.  
  853.           MOV A,#8C      ; fill accumulator with value
  854.  
  855.           Now say that you wanted to move a number that was 7 larger than
  856.           8C.  The correct command would be
  857.  
  858.           MOV A,#8C+07    ;fill accumulator with 7 greater than 8C
  859.  
  860.           This expression is evaluated during the assembly, and the correct
  861.           constant value (147, or 93 hexadecimal) is placed in that memory
  862.           location.  So the command is equivalent to 
  863.  
  864.           MOV A,#93        ;fill accumulator with 93 hex
  865.  
  866.           Since the expression is evaluated before the .OBJ output file is
  867.           written, the statement will not add to the object code file
  868.           length, or slow the program down.  This feature is useful when
  869.           you don't feel like doing the math operaation, or when you want
  870.           to show the relationship between constants.
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.                                           14
  908.  
  909.  
  910.  
  911.  
  912.                       EPASM  Assembler     October 11, 1990
  913.  
  914.  
  915.  
  916.  
  917.           VI. Assembling your program
  918.  
  919.  
  920.           Once the program has been written and saved to disk as an ASCII
  921.           or "DOS" format text file, it is ready to be assembled by EPASM. 
  922.           The following is the command syntax for the assembler:
  923.  
  924.           epasm progname [-w -e -b -l -h] [filename]
  925.  
  926.  
  927.           The "progname" above should be the file name of the ASCII file
  928.           which contains the assembly language program you wish to
  929.           assemble.  It can be just the file name, or the full path if the
  930.           file is not in the default directory.  The extension ".ASM" is
  931.           assumed if none is used.  Be sure not to use the extension .TMP,
  932.           because EPASM uses this for a temporary file, and later erases
  933.           it.  If you have another file with the same root name as your
  934.           program and this extension, it will be erased.
  935.  
  936.           The command line options are:
  937.  
  938.               -w  : create a "work" file, showing the program memory
  939.                     address, the assembled commands, and the original
  940.                     command from the input file source code.  This is
  941.                     extremely useful when debugging the program, to see
  942.                     where the error is occurring and what the EPASM program
  943.                     is trying to do with the commands it is given.  The
  944.                     default file name is the original name, with the
  945.                     extension ".WRK".
  946.  
  947.               -e  : create an error listing file.  This is a file
  948.                     containing all the error messages generated when
  949.                     running EPASM.  These messages are also printed to the
  950.                     screen, but may come too fast to see them all.  The
  951.                     default file name is the original file name with the
  952.                     extension ".ERR".  
  953.  
  954.               -b  : in addition to the ASCII object module created whenever
  955.                     EPASM successfully assembles a file, a binary file
  956.                     containing the machine code can also be created using
  957.                     this option.  The binary file is a non-printable file
  958.                     which is 2K bytes in length and contains no format
  959.                     characters, checksums, etc, just the machine code in
  960.                     binary format.  This file may be useful when a EPROM
  961.                     programming device may require a different format than
  962.                     the default .OBJ module normally created by EPASM. 
  963.                     This binary file can be read easily into a conversion
  964.                     program that the user would write to output the proper
  965.                     format.  The default name for this file is the original
  966.                     name and the extension ".BIN".
  967.  
  968.                                           15
  969.  
  970.  
  971.  
  972.  
  973.                       EPASM  Assembler     October 11, 1990
  974.  
  975.               -l  : this option creates a label listing output file that 
  976.                     may also be useful for debugging purposes.  This file
  977.                     contains a list of the program addresses and the
  978.                     machine code to be placed in that address.  Labels are
  979.                     indicated by a carat (^) followed by an ASCII character
  980.                     for identification.  At the end of the program will be
  981.                     a listing of all the labels used and the characters
  982.                     used to identify them in the listing above it.  This
  983.                     output was mainly used during the development of EPASM,
  984.                     but it can also be useful as a debugging tool.  The
  985.                     default name for this file is the original file name
  986.                     plus the extension ".LAB".
  987.  
  988.               -h :  This option creates a "Hex" output file, which is an 
  989.                     ASCII file with the assembled commands listed in
  990.                     hexadecimal form, 16 bytes per line (32 characters). 
  991.                     This is basically the .OBJ format without the header
  992.                     information and the checksum.  See chapter VIII.
  993.  
  994.  
  995.           Note that when using command line switches, either upper case or
  996.           lower case can be used, so that "-E" is the same as "-e".  Also,
  997.           the DOS switch character can be used (e.g., "/E").  
  998.  
  999.  
  1000.           Running EPASM
  1001.  
  1002.           When EPASM is run without any arguments, the program simply lists
  1003.           the command format and gives a short reminder of the command line
  1004.           options.  To do this, just type
  1005.  
  1006.           C> EPASM
  1007.  
  1008.           (Note: in this example and those below, the "C>" represents the
  1009.           DOS prompt and should not be typed.)  The EPASM program must be
  1010.           in the default directory, or a directory that is accessible via
  1011.           the current DOS PATH defined.  The file INSTR.SET must be in the
  1012.           default directory or the same directory as EPASM, otherwise the
  1013.           error "Instruction set not found" will be generated.  To assemble
  1014.           a program, type EPASM plus the file name to assemble.  For
  1015.           example, if you wish to assemble the file SAMPLE.ASM which is
  1016.           included with this documentation, type
  1017.  
  1018.           C> EPASM SAMPLE
  1019.  
  1020.           The extension ".ASM" is assumed, and need not be entered.  If you
  1021.           wish to assemble a file called SAMPLE.TST, just type 
  1022.  
  1023.           C> EPASM SAMPLE.TST
  1024.  
  1025.           If you use command line switches, separate them with spaces from
  1026.           the rest of the command and from each other.  For example, if you
  1027.           want to create a "work" file and an error listing (if there are
  1028.  
  1029.                                           16
  1030.  
  1031.  
  1032.  
  1033.  
  1034.                       EPASM  Assembler     October 11, 1990
  1035.  
  1036.           any errors in the program), type 
  1037.  
  1038.           C> EPASM SAMPLE -E -W
  1039.  
  1040.           If there are errors, the files SAMPLE.ERR and SAMPLE.WRK will be
  1041.           created.  If there are no errors, the files SAMPLE.WRK and
  1042.           SAMPLE.OBJ will be created.  If you wish to specify different
  1043.           file names for the output files, the names can be included after
  1044.           the switch.  For example, if we want to assemble the file
  1045.           SAMPLE.ASM, but want the work file name to be WORK.SMP, and
  1046.           create in addition to SAMPLE.OBJ a binary output file, we would
  1047.           type 
  1048.  
  1049.           C> EPASM SAMPLE -W WORK.SMP -B
  1050.  
  1051.  
  1052.           While the EPASM program is running, it will notify you of errors
  1053.           it encounters by printing a message to the screen.  If errors are
  1054.           encountered, no .OBJ, .HEX or .BIN output files are generated. 
  1055.           If no errors are encountered, an .OBJ file will be created, along
  1056.           with a .BIN or .HEX file if the proper command line switch is
  1057.           used.  An .ERR file will not be created, even if one is specified
  1058.           using the command line switch.
  1059.  
  1060.           If you wish to stop the assembly at any time, just press any key. 
  1061.           The program will suspend the assembly and ask if you wish to
  1062.           abort.  Type "Y" if you want to stop.  This feature means that
  1063.           you can't "type ahead" the next DOS commands after EPASM, but the
  1064.           ability to terminate the assembly is very useful, mostly when
  1065.           EPASM finds errors and you do not want the assembler to bother
  1066.           with the rest of the file until you have gone back and corrected
  1067.           the errors.
  1068.  
  1069.           The file SAMPLE.ASM is included with this release to mainly
  1070.           illustrate the proper syntax and structure of an .ASM program,
  1071.           not to show good or useful programming technique.  
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.                                           17
  1091.  
  1092.  
  1093.  
  1094.  
  1095.                       EPASM  Assembler     October 11, 1990
  1096.  
  1097.  
  1098.  
  1099.  
  1100.           VII.  Error messages
  1101.  
  1102.  
  1103.           The first section below summarizes some of the errors that may
  1104.           occur in the command used to start EPASM from DOS, and errors in
  1105.           finding the proper files necessary to run EPASM.  The second
  1106.           section describes the error messages given by EPASM when it finds
  1107.           errors in the program it is assembling.  Tips are given as to
  1108.           what to do to correct the errors.
  1109.  
  1110.  
  1111.  
  1112.           VII.1  Command, file, and DOS errors
  1113.  
  1114.  
  1115.           Bad command or file name
  1116.  
  1117.                Make sure that you typed EPASM correctly, and that the
  1118.                EPASM.EXE program is in the current directory, or accessible
  1119.                via the PATH you have currently defined.
  1120.  
  1121.  
  1122.           Instruction set file INSTR.SET not found 
  1123.  
  1124.                The file INSTR.SET is not in the default directory or cannot
  1125.                be found in the directories defined in the current DOS PATH. 
  1126.                Make sure you have copied it from the distribution disk to
  1127.                the proper directory.
  1128.  
  1129.  
  1130.           Error in command line parameter 
  1131.  
  1132.                You used an invalid combinations of switches and file names
  1133.                in the command line when you ran EPASM.  See chapter VI for
  1134.                instructions on using the command line switches and file
  1135.                names.
  1136.  
  1137.  
  1138.           File not found 
  1139.           Path not found
  1140.  
  1141.                The file name you specified is not correct, or it is not in
  1142.                the directory you specified, or that directory does not
  1143.                exist.  Check the file names used in the command line, and
  1144.                in the INCLUDE files used, if any.
  1145.  
  1146.  
  1147.           Disk is write-protected
  1148.  
  1149.                If your files are on a floppy drive, make sure the write
  1150.  
  1151.                                           18
  1152.  
  1153.  
  1154.  
  1155.  
  1156.                       EPASM  Assembler     October 11, 1990
  1157.  
  1158.                protect tab is not on (for a 5 1/4" disk) or in the proper
  1159.                position (covering the hole in the 3.5" disk).
  1160.  
  1161.  
  1162.           Drive not ready
  1163.  
  1164.                Make sure the disk is in the drive specified, and the disk
  1165.                is locked in for reading.
  1166.  
  1167.  
  1168.  
  1169.           VII.2  EPASM assembly errors
  1170.  
  1171.  
  1172.           The following are error messages generated by EPASM when it finds
  1173.           errors in the program it is assembling.  The error message will
  1174.           be printed out, followed by some of the offending text, and a
  1175.           line number.  Often if a line has an error in it, two different
  1176.           error messages will be created, as EPASM tries to interpret the
  1177.           code in different ways.  When the problem is solved, both
  1178.           messages will go away.
  1179.  
  1180.           The error detection in EPASM can only detect certain errors.  It
  1181.           cannot, of course, diagnose logical errors that will cause your
  1182.           program to not work as you expect after you have "burned" the
  1183.           program into your EPROM.
  1184.  
  1185.  
  1186.  
  1187.           Invalid constant character 
  1188.  
  1189.                The text encountered is being interpreted as a hexadecimal
  1190.                constant, and there was an error in converting the number. 
  1191.                You may be trying to define a label that is two or fewer
  1192.                characters in length (a label must be three to eight
  1193.                characters long), or you mistyped the constant (you entered
  1194.                8L when you intended 8C).
  1195.  
  1196.  
  1197.           Hex constant overflow  
  1198.  
  1199.                The assembler is expecting a hexadecimal constant in that
  1200.                location, but the number there is over two digits in length
  1201.                (constant limits are 00 to FF hexadecimal).
  1202.  
  1203.  
  1204.           Invalid jump command 
  1205.  
  1206.                The jump command entered is not a valid MCS-48 jump command.
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.                                           19
  1213.  
  1214.  
  1215.  
  1216.  
  1217.                       EPASM  Assembler     October 11, 1990
  1218.  
  1219.           Syntax error 
  1220.  
  1221.                The command used on the line is not a valid MCS-48 command. 
  1222.                Most likely you have misspelled the command, or the
  1223.                assembler is attempting to evaluate a label as a command. 
  1224.                Make sure there are spaces or tabs separating the elements
  1225.                in a line.
  1226.  
  1227.  
  1228.           Call instruction cannot be located at [address]
  1229.  
  1230.                The CALL instruction cannot be located at addresses 2046-
  1231.                2047 or at 4094-4095.  You must change your program so that
  1232.                these statements do not fall on these addresses.
  1233.  
  1234.  
  1235.           Conditional jump at [address] cannot reach destination
  1236.  
  1237.                The conditional jump commands (e.g., JC, JF0, etc.) can only
  1238.                jump to addresses on the same 256-byte memory page, since
  1239.                the address used in the command is only 8 bits.  The program
  1240.                is trying to jump to a label (address) on another page.  You
  1241.                must change the program so that either the conditional jump
  1242.                and the destination are on the same page, or rewrite the
  1243.                code so that you jump across the page boundary (the CALL and
  1244.                JMP commands are not restricted to one page, they can jump
  1245.                directly to any location within the 2K program memory).
  1246.               
  1247.  
  1248.  
  1249.           Unresolved label 
  1250.  
  1251.                You have referenced a label somewhere, but never defined its
  1252.                location (you define a label by putting it as the first
  1253.                element in some line).  Either you forgot to define it, or
  1254.                misspelled it, either here or where it was defined.
  1255.  
  1256.  
  1257.           Warning: cannot nest INCLUDE files 
  1258.  
  1259.                Your INCLUDE file contains another INCLUDE file.  This is
  1260.                not allowed: call the second INCLUDE file from the main
  1261.                program.  The second INCLUDE file will be ignored, and the
  1262.                assembly will continue.
  1263.  
  1264.  
  1265.           Warning: error opening INCLUDE file 
  1266.  
  1267.                The INCLUDE file you specified could not be found.  The
  1268.                INCLUDE file must be in the default directory, or must be
  1269.                specified by the full path name. The assembly will continue,
  1270.                but without the information in the INCLUDE file.  Check the
  1271.                location of the file.
  1272.  
  1273.                                           20
  1274.  
  1275.  
  1276.  
  1277.  
  1278.                       EPASM  Assembler     October 11, 1990
  1279.  
  1280.  
  1281.           Work file error 
  1282.  
  1283.                There was an error opening or deleting the work file
  1284.                specified (or the default work file name, if none explicitly
  1285.                chosen).  EPASM first creates a work file with the extension
  1286.                .TMP, then at the end, erases this and makes a work file
  1287.                with the extension .WRK, or whatever you have specified.  Be
  1288.                sure not to have any other files in the directory with the
  1289.                extension .TMP, or they may be erased!
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.                                           21
  1335.  
  1336.  
  1337.  
  1338.  
  1339.                       EPASM  Assembler     October 11, 1990
  1340.  
  1341.  
  1342.  
  1343.  
  1344.           VIII.  Using the EPROM programming device
  1345.  
  1346.  
  1347.           The procedure that you use to program or "burn" the EPROM will
  1348.           vary greatly, depending on the device being used.  In most cases
  1349.           you will be able to send the programming device a file of
  1350.           commands, which will direct the device to program the EPROM. 
  1351.           This file is one of the output files from the EPASM program which
  1352.           contains your assembled code, either the default .OBJ file (which
  1353.           is the most common case), or the hex or binary files containing
  1354.           the same program in different format.
  1355.  
  1356.           Some programming devices (such as the PROMPRO-7)  require that
  1357.           you communicate with it using a terminal emulator program.  In
  1358.           this case, the emulator program has to have an "upload" command
  1359.           to send a file to the device.  
  1360.  
  1361.           Other devices come with their own software drivers, such as the
  1362.           B&C Microsystems 1409 Universal programmer.  With this device,
  1363.           the file can be read in and sent directly using commands from the
  1364.           driver program.
  1365.  
  1366.           There are three output file options in the EPASM program.  The
  1367.           default .OBJ files are in Intel hex format.  Each line of the
  1368.           file has the following information (all numbers in hexadecimal):
  1369.  
  1370.  
  1371.                             INTEL  hex  format
  1372.  
  1373.           # of ASCII
  1374.           Characters     Description
  1375.  
  1376.              1         the colon character (:)
  1377.              2         number of data bytes N in record (00 for end record)
  1378.              4         the starting address of where the data bytes are to  
  1379.                         be located
  1380.              2         00=program data in line, 01=end of file record
  1381.             N*2        the program data to be loaded into the EPROM
  1382.              2         checksum (two's compliment of the sum of the bytes 
  1383.                         after the colon character, modulo 256)
  1384.  
  1385.  
  1386.  
  1387.           EPASM always sets N above equal to 10H (16 decimal).  
  1388.  
  1389.           Another format option is the binary file, which contains the
  1390.           program to be loaded into the EPROM with no formatting
  1391.           information, just the bytes starting at address 0 and going to
  1392.           the end of the program memory, for a total of 2048 8-bit bytes of
  1393.           data.  The locations from the end of the assembled program to the
  1394.  
  1395.                                           22
  1396.  
  1397.  
  1398.  
  1399.  
  1400.                       EPASM  Assembler     October 11, 1990
  1401.  
  1402.           end of the program memory space will be filled with zeros.
  1403.  
  1404.           A final format is the ASCII hex file, which contains the ASCII
  1405.           representation of the hex data to be loaded into the EPROM.  This
  1406.           is just the same as the Intel file, except only the program data
  1407.           is in the file, there is no header information or end record. 
  1408.           The data for program starting at address 0 going to the end of
  1409.           the program are included in the file.  Sixteen program memory
  1410.           values are written per line (32 ASCII hex digits).
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.                                           23
  1457.  
  1458.  
  1459.  
  1460.  
  1461.                       EPASM  Assembler     October 11, 1990
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.                                        INVOICE
  1469.  
  1470.  
  1471.  
  1472.  
  1473.           Remit to:
  1474.  
  1475.           Joseph Hora
  1476.           46-1063 Emepela Way, Unit D
  1477.           Kaneohe, HI  96744-3975
  1478.  
  1479.           Questions and technical support number:
  1480.           (808) 956-9848
  1481.           internet: hora@galileo.ifa.hawaii.edu
  1482.  
  1483.  
  1484.                         From:
  1485.  
  1486.                         ________________________________________________
  1487.  
  1488.                         ________________________________________________
  1489.  
  1490.                         ________________________________________________
  1491.  
  1492.                         ________________________________________________
  1493.  
  1494.  
  1495.  
  1496.  
  1497.           Enclosed is $15.00 ( Check ___   Money Order ___  P. Order  ___)
  1498.           for registration of EPASM.  Please send me the latest version of
  1499.           the EPASM program and example files, a printed version of the
  1500.           manual, and the source code for the EPASM program (in Turbo
  1501.           Pascal 5.0), and put me on the mailing list for future updates
  1502.           and extensions to the EPASM program.
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.                                           24
  1518.